package com.yqg.manage.service.impl;

import com.yqg.manage.controller.dto.FileDTO;
import com.yqg.manage.controller.dto.UpLoadDTO;
import com.yqg.manage.entity.RelatedFile;
import com.yqg.manage.mapper.RelatedFileMapper;
import com.yqg.manage.service.IRelatedFileService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;

/**
 * RelatedFileServiceImpl 服务实现类
 *
 * @author suzhuang
 * @since 2023-07-05
 */
@Slf4j
@Service
public class RelatedFileServiceImpl extends ServiceImpl<RelatedFileMapper, RelatedFile> implements IRelatedFileService {

    @Resource
    private RelatedFileMapper relatedFileMapper;

    @Value("${upload.path}")
    private String path;
    @Value("${filename.separator}")
    private String separator;

    @Override
    public String upload(UpLoadDTO upLoadDTO) throws IOException {
        log.info("上传文件：{}，{}，{}", upLoadDTO.getCaseID(), upLoadDTO.getFileName(), upLoadDTO.getFileDesc());

        String newFileName = upLoadDTO.getFileName();
        log.info("新文件名：{}", newFileName);
        //转存到本地
        String newPath = upLoadDTO.getFilePath();
        try {
            RelatedFile relatedFile = new RelatedFile();
            relatedFile.setFilePath(newPath);
            relatedFile.setFileName(newFileName);
            relatedFile.setCaseId(relatedFile.getCaseId());
            relatedFile.setFileDesc(upLoadDTO.getFileDesc());
            // 将新路径记入数据库
            relatedFileMapper.insert(relatedFile);
        } catch (IllegalStateException e) {
            e.printStackTrace();
            return null;
        }
        return newPath;
    }

    @Override
    public RelatedFile[] getCaseList(String caseno) {
        return relatedFileMapper.getCaseList(caseno);
    }

    /**
     * 上传文件并返回文件信息DTO
     *
     * @param file 要上传的文件
     * @return 上传成功后的文件信息DTO，如果文件为null，则返回一个默认文件信息DTO
     */
    @Override
    public FileDTO uploadSign(MultipartFile file) {
        log.info("上传文件：{}", file.getOriginalFilename());
        //获取原始数据名
        String originalFilename = file.getOriginalFilename();
        //构造唯一的文件名（不能重复）
        assert originalFilename != null;
        int index = originalFilename.lastIndexOf(".");
        String extname = originalFilename.substring(index);//找到 . 的索引
        String fileName = originalFilename.substring(0, index);//分离 文件名
        String timestampStr = String.valueOf(System.currentTimeMillis());//当前时间戳
        String newFileName = fileName + separator + timestampStr + extname;//原文件名加时间戳
        log.info("新文件名：{}", newFileName);
        //转存到本地
        String newPath = path + newFileName;//待修改
        try {
            file.transferTo(new File(newPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        FileDTO fileDTO = new FileDTO();
        fileDTO.setName(fileName);
        fileDTO.setUrl(newPath);

        return fileDTO;
    }

    @Override
    public Boolean uploadPDF(MultipartFile file, Long id) {
        //获取原始数据名
        String originalFilename = file.getOriginalFilename();
        log.info("上传文件：{}", originalFilename);

        assert originalFilename != null;
        int index = originalFilename.lastIndexOf(".");
        String extname = originalFilename.substring(index);//找到 . 的索引
        String fileName = originalFilename.substring(0, index);//分离 文件名
        String newFileName = fileName + id + extname;//原文件名加id
        log.info("新文件名：{}", newFileName);
        //转存到本地
        String newPath = path + newFileName;
        try {
            file.transferTo(new File(newPath));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return true;
    }
}
